#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

#include "Queue.h"

QNode* NewQueueNode(DataType data)
{
    QNode* node = (QNode*)malloc(sizeof(QNode));
    if(NULL == node)
    {
        assert(0);
        return NULL;
    }

    node->data = data;
    node->next = NULL;

    return node;
}

//初始化
void QueueInit(Queue* q)
{
    assert(q);

    q->front = q->back = NewQueueNode(0); //创建头节点
}

//入队列
void QueuePush(Queue* q, DataType data)
{
    assert(q);

    q->back->next = NewQueueNode(data); //将新数挂到最后面
    q->back = q->back->next; //将新数的节点变为最后一个节点
}

//出队列
void QueuePop(Queue* q)
{
    assert(q);

    //需要判空
    if(QueueEmpty(q))
        return;

    QNode* delNode = q->front->next;
    q->front->next = delNode->next; //让下下个节点成为头节点的下一个节点(让头节点指向下下个节点)

    //队列中只有一个元素，将该元素删除之后，需要让back节点指向头节点的位置
    if(NULL == delNode->next)
        q->back = q->front;

    free(delNode);
}

//获取队头元素
DataType QueueFront(Queue* q)
{
    assert(q);

    return q->front->next->data;
}

//获取队尾元素
DataType QueueBack(Queue* q)
{
    assert(q);

    return q->back->data;
}

//获取队列中有效元素的个数
int QueueSize(Queue* q)
{
    assert(q);

    //就是节点的个数（不包括头节点）
    int count = 0;
    QNode* cur = q->front->next;
    while(cur)
    {
        ++count;
        cur = cur->next;
    }
    return count;
}

//检测队列是否为空
int QueueEmpty(Queue* q)
{
    assert(q);

    return NULL == q->front->next;
}

//销毁队列  逐个删除节点
void QueueDestroy(Queue* q)
{
    assert(q);

    QNode* cur = q->front;
    while(cur)
    {
        q->front = cur->next;
        free(cur);
        cur = cur->next;
    }

    q->front = q->back = NULL;
}
